# Always print this out before your assignment
sessionInfo()
R version 4.1.2 (2021-11-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] knitr_1.36
loaded via a namespace (and not attached):
[1] Rcpp_1.0.7 digest_0.6.28 later_1.3.0 mime_0.12
[5] R6_2.5.1 lifecycle_1.0.1 xtable_1.8-4 magrittr_2.0.1
[9] evaluate_0.14 rlang_0.4.12 promises_1.2.0.1 ellipsis_0.3.2
[13] rmarkdown_2.11 tools_4.1.2 shiny_1.7.1 yaml_2.2.1
[17] xfun_0.28 httpuv_1.6.3 fastmap_1.1.0 compiler_4.1.2
[21] htmltools_0.5.2
getwd()
[1] "C:/Users/Daniel/Documents/GitHub/MGSC-310-Project"
library("here")
here() starts at C:/Users/Daniel/Documents/GitHub/MGSC-310-Project
library("tidyverse")
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
-- Attaching packages -------------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.3.5 v purrr 0.3.4
v tibble 3.1.6 v dplyr 1.0.7
v tidyr 1.1.4 v stringr 1.4.0
v readr 2.1.0 v forcats 0.5.1
-- Conflicts ----------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
library("forcats")
library("rsample")
library("ggplot2")
library("ggmap")
Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
Please cite ggmap if you use it! See citation("ggmap") for details.
library("dplyr")
library("lubridate")
Attaching package: ‘lubridate’
The following objects are masked from ‘package:base’:
date, intersect, setdiff, union
library("xgboost")
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Attaching package: ‘xgboost’
The following object is masked from ‘package:dplyr’:
slice
library('DiagrammeR')
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
library('Matrix')
Attaching package: ‘Matrix’
The following objects are masked from ‘package:tidyr’:
expand, pack, unpack
crashes <- read.csv(here("datasets", "US_Accidents_Dec20_updated.csv"))
summary(crashes)
ID Severity Start_Time End_Time
Length:1516064 Min. :1.000 Length:1516064 Length:1516064
Class :character 1st Qu.:2.000 Class :character Class :character
Mode :character Median :2.000 Mode :character Mode :character
Mean :2.239
3rd Qu.:2.000
Max. :4.000
Start_Lat Start_Lng End_Lat End_Lng
Min. :24.57 Min. :-124.50 Min. :24.57 Min. :-124.50
1st Qu.:33.85 1st Qu.:-118.21 1st Qu.:33.85 1st Qu.:-118.21
Median :37.35 Median : -94.38 Median :37.35 Median : -94.38
Mean :36.90 Mean : -98.60 Mean :36.90 Mean : -98.60
3rd Qu.:40.73 3rd Qu.: -80.87 3rd Qu.:40.73 3rd Qu.: -80.87
Max. :49.00 Max. : -67.11 Max. :49.08 Max. : -67.11
Distance.mi. Description Number Street
Min. : 0.0000 Length:1516064 Min. : 0 Length:1516064
1st Qu.: 0.0000 Class :character 1st Qu.: 1212 Class :character
Median : 0.1780 Mode :character Median : 4000 Mode :character
Mean : 0.5873 Mean : 8908
3rd Qu.: 0.5940 3rd Qu.: 10100
Max. :155.1860 Max. :9999997
NA's :1046095
Side City County State
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Zipcode Country Timezone Airport_Code
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Weather_Timestamp Temperature.F. Wind_Chill.F. Humidity...
Length:1516064 Min. :-89.00 Min. :-89.0 Min. : 1.00
Class :character 1st Qu.: 47.00 1st Qu.: 40.8 1st Qu.: 48.00
Mode :character Median : 61.00 Median : 57.0 Median : 68.00
Mean : 59.58 Mean : 55.1 Mean : 64.66
3rd Qu.: 73.00 3rd Qu.: 71.0 3rd Qu.: 84.00
Max. :170.60 Max. :113.0 Max. :100.00
NA's :43033 NA's :449316 NA's :45509
Pressure.in. Visibility.mi. Wind_Direction Wind_Speed.mph.
Min. : 0.00 Min. : 0.00 Length:1516064 Min. : 0.00
1st Qu.:29.44 1st Qu.: 10.00 Class :character 1st Qu.: 4.60
Median :29.88 Median : 10.00 Mode :character Median : 7.00
Mean :29.55 Mean : 9.13 Mean : 7.63
3rd Qu.:30.04 3rd Qu.: 10.00 3rd Qu.: 10.40
Max. :58.04 Max. :140.00 Max. :984.00
NA's :36274 NA's :44211 NA's :128862
Precipitation.in. Weather_Condition Amenity Bump
Min. : 0 Length:1516064 Length:1516064 Length:1516064
1st Qu.: 0 Class :character Class :character Class :character
Median : 0 Mode :character Mode :character Mode :character
Mean : 0
3rd Qu.: 0
Max. :24
NA's :510549
Crossing Give_Way Junction No_Exit
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Railway Roundabout Station Stop
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Traffic_Calming Traffic_Signal Turning_Loop Sunrise_Sunset
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Civil_Twilight Nautical_Twilight Astronomical_Twilight
Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
crashes_clean <-
crashes %>%
mutate(Start_Time_Clean = ymd_hms(Start_Time),
End_Time_Clean = ymd_hms(End_Time),
Weather_Condition_Clean = as.factor(Weather_Condition),
Wind_Direction_Clean = as.factor(Wind_Direction),
Weather_Timestamp_Clean = ymd_hms(Weather_Timestamp),
State_Clean = as.factor(State),
County_Clean = as.factor(County),
City_Clean = as.factor(City),
Side_Clean = as.factor(Side))
summary(crashes_clean)
ID Severity Start_Time End_Time
Length:1516064 Min. :1.000 Length:1516064 Length:1516064
Class :character 1st Qu.:2.000 Class :character Class :character
Mode :character Median :2.000 Mode :character Mode :character
Mean :2.239
3rd Qu.:2.000
Max. :4.000
Start_Lat Start_Lng End_Lat End_Lng
Min. :24.57 Min. :-124.50 Min. :24.57 Min. :-124.50
1st Qu.:33.85 1st Qu.:-118.21 1st Qu.:33.85 1st Qu.:-118.21
Median :37.35 Median : -94.38 Median :37.35 Median : -94.38
Mean :36.90 Mean : -98.60 Mean :36.90 Mean : -98.60
3rd Qu.:40.73 3rd Qu.: -80.87 3rd Qu.:40.73 3rd Qu.: -80.87
Max. :49.00 Max. : -67.11 Max. :49.08 Max. : -67.11
Distance.mi. Description Number Street
Min. : 0.0000 Length:1516064 Min. : 0 Length:1516064
1st Qu.: 0.0000 Class :character 1st Qu.: 1212 Class :character
Median : 0.1780 Mode :character Median : 4000 Mode :character
Mean : 0.5873 Mean : 8908
3rd Qu.: 0.5940 3rd Qu.: 10100
Max. :155.1860 Max. :9999997
NA's :1046095
Side City County State
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Zipcode Country Timezone Airport_Code
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Weather_Timestamp Temperature.F. Wind_Chill.F. Humidity...
Length:1516064 Min. :-89.00 Min. :-89.0 Min. : 1.00
Class :character 1st Qu.: 47.00 1st Qu.: 40.8 1st Qu.: 48.00
Mode :character Median : 61.00 Median : 57.0 Median : 68.00
Mean : 59.58 Mean : 55.1 Mean : 64.66
3rd Qu.: 73.00 3rd Qu.: 71.0 3rd Qu.: 84.00
Max. :170.60 Max. :113.0 Max. :100.00
NA's :43033 NA's :449316 NA's :45509
Pressure.in. Visibility.mi. Wind_Direction Wind_Speed.mph.
Min. : 0.00 Min. : 0.00 Length:1516064 Min. : 0.00
1st Qu.:29.44 1st Qu.: 10.00 Class :character 1st Qu.: 4.60
Median :29.88 Median : 10.00 Mode :character Median : 7.00
Mean :29.55 Mean : 9.13 Mean : 7.63
3rd Qu.:30.04 3rd Qu.: 10.00 3rd Qu.: 10.40
Max. :58.04 Max. :140.00 Max. :984.00
NA's :36274 NA's :44211 NA's :128862
Precipitation.in. Weather_Condition Amenity Bump
Min. : 0 Length:1516064 Length:1516064 Length:1516064
1st Qu.: 0 Class :character Class :character Class :character
Median : 0 Mode :character Mode :character Mode :character
Mean : 0
3rd Qu.: 0
Max. :24
NA's :510549
Crossing Give_Way Junction No_Exit
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Railway Roundabout Station Stop
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Traffic_Calming Traffic_Signal Turning_Loop Sunrise_Sunset
Length:1516064 Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Civil_Twilight Nautical_Twilight Astronomical_Twilight
Length:1516064 Length:1516064 Length:1516064
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
Start_Time_Clean End_Time_Clean
Min. :2016-02-08 00:37:08 Min. :2016-02-08 06:37:08
1st Qu.:2018-07-17 14:41:25 1st Qu.:2018-07-17 17:13:14
Median :2020-01-24 11:16:33 Median :2020-01-24 13:38:15
Mean :2019-07-15 07:01:48 Mean :2019-07-15 11:42:20
3rd Qu.:2020-10-22 13:01:30 3rd Qu.:2020-10-22 17:50:19
Max. :2020-12-31 23:28:56 Max. :2021-01-01 00:00:00
Weather_Condition_Clean Wind_Direction_Clean Weather_Timestamp_Clean
Fair :465252 CALM :202870 Min. :2016-02-08 00:53:00
Mostly Cloudy:193595 Calm : 79192 1st Qu.:2018-07-10 10:55:30
Clear :180223 WNW : 77743 Median :2020-01-22 05:53:00
Cloudy :161291 NW : 75810 Mean :2019-07-12 00:02:11
Partly Cloudy:133102 W : 72059 3rd Qu.:2020-10-21 04:54:00
Overcast : 87853 SSW : 69901 Max. :2020-12-31 23:35:00
(Other) :294748 (Other):938489 NA's :30264
State_Clean County_Clean City_Clean Side_Clean
CA :448833 Los Angeles : 138819 Los Angeles: 39984 L: 221502
FL :153007 Orange : 49833 Miami : 36233 R:1294562
OR : 87484 Miami-Dade : 47382 Charlotte : 22203
TX : 75142 San Bernardino: 30251 Houston : 20843
NY : 60974 San Diego : 26623 Dallas : 19497
MN : 52345 Sacramento : 25941 Sacramento : 18431
(Other):638279 (Other) :1197215 (Other) :1358873
qmplot(Start_Lng, Start_Lat, data = crashes, maptype = "toner-lite", color = factor(Severity))
Using zoom = 4...
Source : http://tile.stamen.com/terrain/4/2/5.png
Source : http://tile.stamen.com/terrain/4/3/5.png
Source : http://tile.stamen.com/terrain/4/4/5.png
Source : http://tile.stamen.com/terrain/4/5/5.png
Source : http://tile.stamen.com/terrain/4/2/6.png
Source : http://tile.stamen.com/terrain/4/3/6.png
Source : http://tile.stamen.com/terrain/4/4/6.png
Source : http://tile.stamen.com/terrain/4/5/6.png

qmplot(End_Lng, End_Lat, data = crashes, maptype = "toner-lite", color = factor(Severity))
Using zoom = 4...

ggplot(data = crashes_clean, aes(x = Severity)) + geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = crashes_clean, aes(x = Start_Time_Clean, y = Distance.mi.)) + geom_line()

NA
NA
crashes_clean %>%
ggplot(aes(Start_Time_Clean)) + geom_histogram(binwidth = 86400)

crashes_clean %>%
mutate(wday = wday(Start_Time, label = TRUE)) %>%
ggplot(aes(x = wday)) +
geom_bar()

NA
NA
NA
crashes_split <- initial_split(crashes_clean, prop = 0.75)
crashes_train <- training(crashes_split)
crashes_test <- testing(crashes_split)
crashes_xgb <- crashes %>%
select(-ID,
-Description,
-Street,
-Weather_Timestamp,
-Number,
-Airport_Code,
-Country,
-Turning_Loop) %>%
drop_na()
crashes_split_xgb <- initial_split(crashes_xgb, prop = 0.75)
crashes_train_xbg <- training(crashes_split_xgb)
crashes_test_xbg <- testing(crashes_split_xgb)
sparse_matrix_train <- sparse.model.matrix(Severity ~ .-1, data = crashes_train_xbg)
sparse_matrix_test <- sparse.model.matrix(Severity ~ .-1, data = crashes_test_xbg)
y_train <- as.integer(crashes_train_xbg$Severity) - 1
y_test <- as.integer(crashes_test_xbg$Severity) - 1
xgb_train <- xgb.DMatrix(data = sparse_matrix_train, label = y_train)
xgb_test <- xgb.DMatrix(data = sparse_matrix_test, label = y_test)
xgb <- xgboost(data = xgb_train,
eta = 0.1,
max_depth = 15,
nround=15,
subsample = 0.5,
colsample_bytree = 0.5,
seed = 1,
eval_metric = "merror",
objective = "multi:softprob",
num_class = 12,
nthread = 3
)
[1] train-merror:0.121129
[2] train-merror:0.119005
[3] train-merror:0.116654
[4] train-merror:0.116310
[5] train-merror:0.115802
[6] train-merror:0.114656
[7] train-merror:0.113980
[8] train-merror:0.113268
[9] train-merror:0.112950
[10] train-merror:0.112491
[11] train-merror:0.112443
[12] train-merror:0.112142
[13] train-merror:0.111790
[14] train-merror:0.111420
[15] train-merror:0.110877
y_pred <- predict(xgb, newdata = xgb_train)
print(length(y_pred))
[1] 8492208
print(head(y_pred))
[1] 0.03920371 0.64076769 0.05910405 0.04018567 0.02759238 0.02759238
err <- mean(as.numeric(y_pred > 0.5))
print(paste("test-error=", err))
[1] "test-error= 0.0724792656986263"
tree_plot <- xgb.plot.tree(model = xgb, trees = 1, feature.keep = 3)
tree_plot
NA
NA
importance_matrix <- xgb.importance(model = xgb)
xgb.plot.importance(importance_matrix)

importance_matrix
LS0tDQp0aXRsZTogIkZpbmFsIFByb2plY3QiDQphdXRob3I6ICJEYW5pZWwgQ2hlbGxpbmciDQpzdWJ0aXRsZTogTUdTQyAzMTAgUHJvamVjdCANCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoNCiMgUGxlYXNlIGxlYXZlIHRoaXMgY29kZSBjaHVuayBhcyBpcy4gSXQgbWFrZXMgc29tZSBzbGlnaHQgZm9ybWF0dGluZyBjaGFuZ2VzIHRvIGFsdGVyIHRoZSBvdXRwdXQgdG8gYmUgbW9yZSBhZXN0aGV0aWNhbGx5IHBsZWFzaW5nLiANCg0KbGlicmFyeShrbml0cikNCg0KIyBDaGFuZ2UgdGhlIG51bWJlciBpbiBzZXQgc2VlZCB0byB5b3VyIG93biBmYXZvcml0ZSBudW1iZXINCnNldC5zZWVkKDE4MTgpDQpvcHRpb25zKHdpZHRoPTcwKQ0Kb3B0aW9ucyhzY2lwZW49OTkpDQoNCg0KIyB0aGlzIHNldHMgdGV4dCBvdXRwdXR0ZWQgaW4gY29kZSBjaHVua3MgdG8gc21hbGwNCm9wdHNfY2h1bmskc2V0KHRpZHkub3B0cz1saXN0KHdpZHRoLndyYXA9NTApLHRpZHk9VFJVRSwgc2l6ZSA9ICJ2c21hbGwiKSAgDQpvcHRzX2NodW5rJHNldChtZXNzYWdlID0gRkFMU0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsDQogICAgICAgICAgICAgICAjICJjYWNoaW5nIiBzdG9yZXMgb2JqZWN0cyBpbiBjb2RlIGNodW5rcyBhbmQgb25seSByZXdyaXRlcyBpZiB5b3UgY2hhbmdlIHRoaW5ncw0KICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAjIGF1dG9tYXRpY2FsbHkgZG93bmxvYWRzIGRlcGVuZGVuY3kgZmlsZXMNCiAgICAgICAgICAgICAgIGF1dG9kZXAgPSBUUlVFLA0KICAgICAgICAgICAgICAgIyANCiAgICAgICAgICAgICAgIGNhY2hlLmNvbW1lbnRzID0gRkFMU0UsDQogICAgICAgICAgICAgICAjIA0KICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLA0KICAgICAgICAgICAgICAgIyBjaGFuZ2UgZmlnLndpZHRoIGFuZCBmaWcuaGVpZ2h0IHRvIGNoYW5nZSB0aGUgY29kZSBoZWlnaHQgYW5kIHdpZHRoIGJ5IGRlZmF1bHQNCiAgICAgICAgICAgICAgIGZpZy53aWR0aCA9IDUuNSwgIA0KICAgICAgICAgICAgICAgZmlnLmhlaWdodCA9IDQuNSwNCiAgICAgICAgICAgICAgIGZpZy5hbGlnbj0nY2VudGVyJykNCg0KDQpgYGANCg0KYGBge3Igc2V0dXAtMn0NCg0KIyBBbHdheXMgcHJpbnQgdGhpcyBvdXQgYmVmb3JlIHlvdXIgYXNzaWdubWVudA0Kc2Vzc2lvbkluZm8oKQ0KZ2V0d2QoKQ0KDQpgYGANCg0KDQo8IS0tICMjIyBzdGFydCBhbnN3ZXJpbmcgeW91ciBwcm9ibGVtIHNldCBoZXJlIC0tPg0KPCEtLSBZb3UgbWF5IGV4cG9ydCB5b3VyIGhvbWV3b3JrIGluIGVpdGhlciBodG1sIG9yIHBkZiwgd2l0aCB0aGUgZm9ybWVyIHVzdWFsbHkgYmVpbmcgZWFzaWVyLiANCiAgICAgVG8gZXhwb3J0IG9yIGNvbXBpbGUgeW91ciBSbWQgZmlsZTogY2xpY2sgYWJvdmUgb24gJ0tuaXQnIHRoZW4gJ0tuaXQgdG8gSFRNTCcgLS0+DQo8IS0tIEJlIHN1cmUgdG8gc3VibWl0IGJvdGggeW91ciAuUm1kIGZpbGUgYW5kIHRoZSBjb21waWxlZCAuaHRtbCBvciAucGRmIGZpbGUgZm9yIGZ1bGwgY3JlZGl0IC0tPg0KDQoNCmBgYHtyIHNldHVwLTN9DQoNCmxpYnJhcnkoImhlcmUiKQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCmxpYnJhcnkoImZvcmNhdHMiKQ0KbGlicmFyeSgicnNhbXBsZSIpDQpsaWJyYXJ5KCJnZ3Bsb3QyIikNCmxpYnJhcnkoImdnbWFwIikNCmxpYnJhcnkoImRwbHlyIikNCmxpYnJhcnkoImx1YnJpZGF0ZSIpDQpsaWJyYXJ5KCJ4Z2Jvb3N0IikNCmxpYnJhcnkoJ0RpYWdyYW1tZVInKQ0KbGlicmFyeSgnTWF0cml4JykNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KY3Jhc2hlcyA8LSByZWFkLmNzdihoZXJlKCJkYXRhc2V0cyIsICJVU19BY2NpZGVudHNfRGVjMjBfdXBkYXRlZC5jc3YiKSkNCg0KDQpgYGANCg0KYGBge3J9DQoNCnN1bW1hcnkoY3Jhc2hlcykNCg0KDQpgYGANCg0KYGBge3J9DQoNCg0KY3Jhc2hlc19jbGVhbiA8LQ0KICBjcmFzaGVzICU+JSANCiAgbXV0YXRlKFN0YXJ0X1RpbWVfQ2xlYW4gPSB5bWRfaG1zKFN0YXJ0X1RpbWUpLA0KICAgICAgICAgRW5kX1RpbWVfQ2xlYW4gPSB5bWRfaG1zKEVuZF9UaW1lKSwNCiAgICAgICAgIFdlYXRoZXJfQ29uZGl0aW9uX0NsZWFuID0gYXMuZmFjdG9yKFdlYXRoZXJfQ29uZGl0aW9uKSwNCiAgICAgICAgIFdpbmRfRGlyZWN0aW9uX0NsZWFuID0gYXMuZmFjdG9yKFdpbmRfRGlyZWN0aW9uKSwNCiAgICAgICAgIFdlYXRoZXJfVGltZXN0YW1wX0NsZWFuID0geW1kX2htcyhXZWF0aGVyX1RpbWVzdGFtcCksDQogICAgICAgICBTdGF0ZV9DbGVhbiA9IGFzLmZhY3RvcihTdGF0ZSksDQogICAgICAgICBDb3VudHlfQ2xlYW4gPSBhcy5mYWN0b3IoQ291bnR5KSwNCiAgICAgICAgIENpdHlfQ2xlYW4gPSBhcy5mYWN0b3IoQ2l0eSksDQogICAgICAgICBTaWRlX0NsZWFuID0gYXMuZmFjdG9yKFNpZGUpKQ0KICANCg0Kc3VtbWFyeShjcmFzaGVzX2NsZWFuKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpxbXBsb3QoU3RhcnRfTG5nLCBTdGFydF9MYXQsIGRhdGEgPSBjcmFzaGVzLCBtYXB0eXBlID0gInRvbmVyLWxpdGUiLCBjb2xvciA9IGZhY3RvcihTZXZlcml0eSkpDQoNCnFtcGxvdChFbmRfTG5nLCBFbmRfTGF0LCBkYXRhID0gY3Jhc2hlcywgbWFwdHlwZSA9ICJ0b25lci1saXRlIiwgY29sb3IgPSBmYWN0b3IoU2V2ZXJpdHkpKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KZ2dwbG90KGRhdGEgPSBjcmFzaGVzX2NsZWFuLCBhZXMoeCA9IFNldmVyaXR5KSkgKyBnZW9tX2hpc3RvZ3JhbSgpDQoNCg0KDQpgYGANCg0KYGBge3J9DQoNCmdncGxvdChkYXRhID0gY3Jhc2hlc19jbGVhbiwgYWVzKHggPSBTdGFydF9UaW1lX0NsZWFuLCB5ID0gRGlzdGFuY2UubWkuKSkgKyBnZW9tX2xpbmUoKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KY3Jhc2hlc19jbGVhbiAlPiUgDQogIGdncGxvdChhZXMoU3RhcnRfVGltZV9DbGVhbikpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA4NjQwMCkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpjcmFzaGVzX2NsZWFuICU+JSANCiAgbXV0YXRlKHdkYXkgPSB3ZGF5KFN0YXJ0X1RpbWUsIGxhYmVsID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gd2RheSkpICsNCiAgICBnZW9tX2JhcigpDQoNCg0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpjcmFzaGVzX3NwbGl0IDwtIGluaXRpYWxfc3BsaXQoY3Jhc2hlc19jbGVhbiwgcHJvcCA9IDAuNzUpDQoNCmNyYXNoZXNfdHJhaW4gPC0gdHJhaW5pbmcoY3Jhc2hlc19zcGxpdCkNCmNyYXNoZXNfdGVzdCA8LSB0ZXN0aW5nKGNyYXNoZXNfc3BsaXQpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KDQpjcmFzaGVzX3hnYiA8LSBjcmFzaGVzICU+JSANCiAgc2VsZWN0KC1JRCwNCiAgICAgICAgIC1EZXNjcmlwdGlvbiwNCiAgICAgICAgIC1TdHJlZXQsDQogICAgICAgICAtV2VhdGhlcl9UaW1lc3RhbXAsDQogICAgICAgICAtTnVtYmVyLA0KICAgICAgICAgLUFpcnBvcnRfQ29kZSwNCiAgICAgICAgIC1Db3VudHJ5LA0KICAgICAgICAgLVR1cm5pbmdfTG9vcCkgJT4lIA0KICBkcm9wX25hKCkNCg0KY3Jhc2hlc19zcGxpdF94Z2IgPC0gaW5pdGlhbF9zcGxpdChjcmFzaGVzX3hnYiwgcHJvcCA9IDAuNzUpDQoNCmNyYXNoZXNfdHJhaW5feGJnIDwtIHRyYWluaW5nKGNyYXNoZXNfc3BsaXRfeGdiKQ0KY3Jhc2hlc190ZXN0X3hiZyA8LSB0ZXN0aW5nKGNyYXNoZXNfc3BsaXRfeGdiKQ0KDQoNCnNwYXJzZV9tYXRyaXhfdHJhaW4gPC0gc3BhcnNlLm1vZGVsLm1hdHJpeChTZXZlcml0eSB+IC4tMSwgZGF0YSA9IGNyYXNoZXNfdHJhaW5feGJnKQ0Kc3BhcnNlX21hdHJpeF90ZXN0IDwtIHNwYXJzZS5tb2RlbC5tYXRyaXgoU2V2ZXJpdHkgfiAuLTEsIGRhdGEgPSBjcmFzaGVzX3Rlc3RfeGJnKQ0KDQoNCnlfdHJhaW4gPC0gYXMuaW50ZWdlcihjcmFzaGVzX3RyYWluX3hiZyRTZXZlcml0eSkgLSAxDQp5X3Rlc3QgPC0gYXMuaW50ZWdlcihjcmFzaGVzX3Rlc3RfeGJnJFNldmVyaXR5KSAtIDENCg0KeGdiX3RyYWluIDwtIHhnYi5ETWF0cml4KGRhdGEgPSBzcGFyc2VfbWF0cml4X3RyYWluLCBsYWJlbCA9IHlfdHJhaW4pDQp4Z2JfdGVzdCA8LSB4Z2IuRE1hdHJpeChkYXRhID0gc3BhcnNlX21hdHJpeF90ZXN0LCBsYWJlbCA9IHlfdGVzdCkNCg0KDQpgYGANCg0KYGBge3J9DQoNCnhnYiA8LSB4Z2Jvb3N0KGRhdGEgPSB4Z2JfdHJhaW4sDQogZXRhID0gMC4xLA0KIG1heF9kZXB0aCA9IDE1LCANCiBucm91bmQ9MTUsIA0KIHN1YnNhbXBsZSA9IDAuNSwNCiBjb2xzYW1wbGVfYnl0cmVlID0gMC41LA0KIHNlZWQgPSAxLA0KIGV2YWxfbWV0cmljID0gIm1lcnJvciIsDQogb2JqZWN0aXZlID0gIm11bHRpOnNvZnRwcm9iIiwNCiBudW1fY2xhc3MgPSAxMiwNCiBudGhyZWFkID0gMw0KKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQp5X3ByZWQgPC0gcHJlZGljdCh4Z2IsIG5ld2RhdGEgPSB4Z2JfdHJhaW4pDQpwcmludChsZW5ndGgoeV9wcmVkKSkNCnByaW50KGhlYWQoeV9wcmVkKSkNCg0KYGBgDQoNCmBgYHtyfQ0KDQplcnIgPC0gbWVhbihhcy5udW1lcmljKHlfcHJlZCA+IDAuNSkpDQpwcmludChwYXN0ZSgidGVzdC1lcnJvcj0iLCBlcnIpKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KDQp0cmVlX3Bsb3QgPC0geGdiLnBsb3QudHJlZShtb2RlbCA9IHhnYiwgdHJlZXMgPSAxLCBmZWF0dXJlLmtlZXAgPSAzKQ0KDQp0cmVlX3Bsb3QNCg0KDQpgYGANCmBgYHtyfQ0KDQppbXBvcnRhbmNlX21hdHJpeCA8LSB4Z2IuaW1wb3J0YW5jZShtb2RlbCA9IHhnYikNCnhnYi5wbG90LmltcG9ydGFuY2UoaW1wb3J0YW5jZV9tYXRyaXgpDQoNCg0KaW1wb3J0YW5jZV9tYXRyaXgNCmBgYA==